嗨,我是芥龍!很高興能與你見面!
在幾個月前,閒閒沒事的我在網路上衝浪,並且找到了 Build Your Own X 這個 GitHub Repository。
我當時稍微嘗試了一下 Build Redis from Scratch,這對我而言是個很好的起點:我曾經用 PHP 或 Go 打造過許多基於 HTTP 的應用程式,這期間也用過許多 SQL/NoSQL 資料庫,但我並沒有從頭實作過一個基於 TCP 的應用程式。
What I can’t build, I don’t understand. ― Richard Feynman
我並不理解我不能建造的東西。--理查德.費曼
我認為這對我來說是個有趣的旅程,我希望你也可以樂在其中。
本系列文章基於我個人撰寫的教材 Olivine: A key-value storage supports RESP, written in Go,這是我為了練英文寫作才做的 Side Project。
在這個基礎上,鐵人賽的發文還會加入一些閒談跟小知識,還有一些我對架構上的思考(因為英文不夠好以致於沒辦法在那邊呈現出來……),不過兩邊的內容完全可以分開來看。
程式碼的部份會在首行以註解的方式敘明檔案名稱為位置,例如:
// file: ./main.go -> 這表示位於專案根目錄的 main.go 這個檔案
package main
func main() {
}
對於一些較長的或不重要的內容,則會以 // ... 省略,以避免佔用過多版塊。
對於指令內容會用程式碼區塊包裏,有 $ 前綴代表用戶自行輸入的內容,沒有前綴則表示預期會在 console 中輸出的內容:
$ echo "Hello World"
Hello World
有些時候會在不同的命令列中使用指令,$ 前綴代表相容於 POSIX 的命令列;(shell name) > 代表其它不同種類的命令列:
$ redis-cli
(redis) > PING
PONG
會使用 Quote 的方式撰寫註釋、提示或警告:
註:這是一個註釋
提示:這是一個簡單的提示
警告:這是一個警告
不,別作夢了。我做這個單純是出於興趣與學習。
我並不認為我可以完完全全比照 Redis 功能做出一個 Production Ready 的應用程式(說實話,光是實現一些小命令就讓我忙得焦頭爛額了),如果你需要一個相容於 Redis 並且可以用於線上服務的話,除了官方版也可以選擇 Valkey 或 Garnet。
我個人會使用 AI 幫我總結與整理一些資訊(例如通訊協定、檔案結構等),並且生成一些比較繁瑣的程式碼或從中獲取一些靈感。
然而,我並不打算用 AI 直接生成整個專案或功能:我不認為這是一個良好的學習習慣,因為它跳過了最重要的「理解」步驟。
同時,我也不打算用 AI 直接產生文章:在 It's rude to show AI output to people 一文中,我認同不應該直接把 AI 產生的內容粗魯貼在任何人類臉上,且我個人仍然比較偏好於有溫度的文章(我也方便在文章裡講點垃圾話)。
畢竟,現在打開社群媒體處處充斥著 AI 文案與影音,也稍微是時候讓我們人類的閱讀與審美休息一下了。
我並不會從一開始就過度關注效能,除非是為了講解一些原理或設計方案;我也會在一些文章中刻意留下效能問題,並且後續使用工程手段加以改善。
我是芥龍,在 2023 年中旬以前是一位 PHP/Laravel 開發者,在上一間公司服務時從頭開始學習 Go 語言並使用至今。不過 PHP 仍是世界上最好的語言,不接受反駁
我曾經在 2019 年第 11 屆鐵人賽分享 成為 Modern PHPer,這也是我第二次參與鐵人賽。
我擅長 Go 與 PHP,不過最近做的 Side Project 都是 Javascript……,或許等這個主題結束(或失敗?)後我再另外開一個系列講講 Side Project 吧。